package com.cn.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.UUID;

public class JwtUtil {
    // 有效时间为5秒
    private static long time = 1000 * 60 ;

    private static SecretKey signature = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    public static String createToken() {
        JwtBuilder jwtBuilder = Jwts.builder();

        // 生成 JWT Token
        String jwtToken = jwtBuilder
                .setHeaderParam("typ", "JWT") // 设置 JWT 类型
                .setHeaderParam("alg", "HS256") // 设置签名算法
                .claim("username", "admin") // 添加 username 到载荷中（自定义的key:value）
                .claim("password", "123") // 添加 username 到载荷中（自定义的key:value）
                .claim("role", "admin") // 添加 role 到载荷中（自定义的key:value）
                .setSubject("admin-test") // 设置主题
                .setExpiration(new Date(System.currentTimeMillis() + time)) // 设置过期时间
                .setId(UUID.randomUUID().toString()) // 设置 JWT ID，通常是随机生成的
                .signWith(signature) // 签名 JWT，用以验证其完整性
                .compact(); // 压缩 JWT 到一个 compact, URL-safe string
        System.out.println(signature);
        return jwtToken;
    }

    public static Boolean checkToken(String token) {
        // 判断 token 是否为空
        if (token == null) {
            return false;
        }
        try {
            // 解析并验证 token
            Jws<Claims> jws = Jwts.parserBuilder()
                    .setSigningKey(signature)  // 使用之前的签名秘钥验证 token
                    .build()
                    .parseClaimsJws(token);

            // 从 jws 中获取到 token 的载荷
            Claims claims = jws.getBody();
            String username = claims.get("username", String.class);
            String password = claims.get("password", String.class);
            System.out.println("username  " + username);
            System.out.println("password  " + password);
            return username.equals("admin") && password.equals("123");
        } catch (Exception e) {
            return false;
        }
    }

}
